package cn.wp.common.core.generate;

import cn.hutool.core.lang.Console;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.util.JdbcConstants;

import java.util.Scanner;

/**
 * Sql语句格式化
 *
 * IDEA中Junit使用Scanner控制台输入卡死解决办法
 * 解决方案：
 * 在你的Idea安装目录下的：
 * D:\JetBrains\IntelliJ IDEA 2019.1.3\bin
 * 里面的文件 idea64.exe.vmoptions追加以下内容：
 * -Deditable.java.test.console=true；
 *
 * Created by chenyb on 2019/09/29
 */
public class SqlFormat {

    public static String format(String sql){
        // 查询的SQL以及对应的SQL类型
        String result = SQLUtils.format(sql, JdbcConstants.MYSQL);
        // 查询的SQL以及对应的SQL类型以及具体大小写
        String resultLCase = SQLUtils.format(result
                , JdbcConstants.HIVE
                , SQLUtils.DEFAULT_LCASE_FORMAT_OPTION);
        // \t 替换为4个空格
        return resultLCase.replaceAll("\t","    ");
    }

    public static String sqlStringFormat(String sql){
        String[] res = sql.split("\n");
        String sqlStringResult = "SqlString sqlString = SqlString.newInstance();\n";
        for(String s : res){
            sqlStringResult += "sqlString.add(\"" + s + "\");\n";
        }
        return sqlStringResult;
    }

    // 运行
    public static void run() {
        Scanner scanner = new Scanner(System.in);
        // 解决回车及空格输入问题
        scanner.useDelimiter("\n");
        Console.log("请在下方粘贴需格式化的Sql语句(输入完成后，回车输入$$执行生成)：");
        String sql = "";
        while(scanner.hasNext()){
            String tmp = scanner.next();
            // sql输入完后，输入 $$ 结束标记
            if("$$".equals(tmp)){
                break;
            }
            sql += tmp;
        }

        String formatSql = format(sql);
        System.out.println("\n格式化Sql结果：");
        System.out.println("------------------------------------------------------");
        System.out.println(formatSql);
        System.out.println("------------------------------------------------------");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        String str = "left join sys_role r on rm.role_id = r.id";

        System.err.println("\nSqlString格式化Sql结果：");
        System.err.println("------------------------------------------------------");
        System.err.println(sqlStringFormat(formatSql));
        System.err.println("------------------------------------------------------");
    }

    // 测试
    public static void main(String[] args) {
        run();
    }

}
